串口接收开始时正常,过一段时间接收不到任何数,其他程序正常,没有死机 |
您所在的位置:网站首页 › win7 hal丢失 › 串口接收开始时正常,过一段时间接收不到任何数,其他程序正常,没有死机 |
在初始化后,如果曾经接收正常过,说明你的基础配置是没有问题的,过一段时间后收不到任何数,并且你的程序还在跑,并没有硬件错误之类的,这种情况一般是数据量太大导致了串口的过载宕机。 如何确定你的串口是否过载宕机了?连接你的单片机进入仿真,peripherals->system view->USART里选择你的当前可能宕机的串口号,则会出现该串口的寄存器,在新出现的页卡里找到ISR寄存器展开,往下翻找到ORE,看是否被打上了√,当发生串口过载错误时,就会出现此现象。 给一个简单直接的解决办法,大家可以用这个办法为基础,自己依据需求变化: 利用你程序里已经开的定时器,周期不用太长或者太短,1秒钟-1分钟都可以,只要你能接受,直接判断ORE是否被置位,判断ORE的方法如下: 标准库查询函数USART_GetITStatus(USARTx, USART_IT_ORE) hal库查询函数__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE); 如果查询判断结果是1,直接重新初始化对应的串口。初始化串口的函数不用我罗列了,就是程序一开始调用的那个,usart1_init()什么的,hal库有自己生成的init,重新调用一下,那么串口就会重新启动了。 下面贴了hal库的解决方法,以串口2为例,标准库也类似,甚至标准库的初始化更简单直接将main开始的串口初始化函数再调用一遍即可。 //清理ORE的标志位 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF); //可能需要在这插入 //如果你存储过初始化的数据,并且不想修改,直接重新初始化串口2 HAL_UART_Init(huart2); //如果有你想修改,或者之前没有初始化的话,需要将下面的一段放到上面的插入处 huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1; huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK) { Error_Handler(); }就是这么简单。 如果对你有用的话,留个言或者点个赞吧~ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |